
class CapacitaSuperataException < Exception

class Linea
  attr_accessor :orig, :desti, :usocap, :max_cap
  include Comparable

  def initialize( origine, dest, maxcap)
      @orig=origine
      @desti=dest
      @max_cap=maxcap
      @usocap=0
    end


  def usa(c)
        if (@max_cap-@usocap<c)
            raise CapacitaSuperataException
        @usocap+=c
        return @max_cap-@usocap
        end
  end

  def to_s
      return "#{@orig} -->  #{@desti}  #{@usocap} #{@max_cap} "
  end
end

class Rete

  include Comparable

  def initialize()
    @rete=[]
    @città=[]
  end

  def aggiungi_linea(x)
        @rete << x
        @città << x.orig
        @città << x.desti
  end

  def to_s()
        s=""
        x=0
        for i in @rete
            s+= "#{i} \n"
            x += i.usocap
        end
       return "#{s} \n #{x} \n";
  end

  def citta_servite()
        s=""
        for i in @città
            s+= "#{i} \n";
        end
        return "#{s} #{@città.size}"
   end

   def totale_trasportato(c1,c2)
       tot=0
        for i in @rete
            if (i.orig.eql?(c1) && i.desti.eql?(c2))
             tot+=i.usocap
            end
        end
       return tot
   end

   def trasporta(c1, c2, c)
        for i in @rete
            if (i.orig.eql?(c1) && i.desti.eql?(c2))
             begin CapacitaSuperataException e
             rescue
            i.usa(c)
            return true
            end
         end
        end
    return false
    end

   def elenca_coppie_città()
     s=""
     copia={}
     for i in @rete
        unless copia.key?(i)
     copia[i] << totale_trasportato(i.orig,i.desti)
     end
     end
     copia.sort!
     copia.each_key {|key| s += "#{key.orig} #{key.dest} #{key.value} \n" }
     return s
   end

end


 def main

        puts("===== Inizio test ======")
        puts("---- test linee ----")
         alat1 = new Linea("Alessandria", "Asti", 30)
         alat2 = new Linea("Alessandria", "Asti", 40)
         atal1 = new Linea("Asti", "Alessandria", 25)
         atal2 = new Linea("Asti", "Alessandria", 50)
        puts(alat1.usa(24))
        begin CapacitaSuperataException e
            puts("Eccezione OK")
         rescue 
            alat1.usa(10)
            puts("Errore: eccezione non lanciata")
        end

        puts(alat2.usa(25))
        begin CapacitaSuperataException e
            puts("Eccezione OK")
        
        rescue 
            atal1.usa(100)
            puts("Errore: eccezione non lanciata")
        end

        puts(alat1)
        puts(alat2)
        puts(atal1)
        puts(atal2)
         alge1 = new Linea("Alessandria", "Genova", 90)
         alge2 = new Linea("Alessandria", "Genova", 60)
        puts(alge2.usa(10))
        puts(alge2.usa(12))
        puts(alge2)


        puts("---- test creazione rete ----")
         alegas = new Rete()
        alegas.aggiungi_linea(alat1)
        alegas.aggiungi_linea(alat2)
        puts(alegas)
        puts("---")
        alegas.aggiungi_linea(atal1)
        alegas.aggiungi_linea(atal2)
        alegas.aggiungi_linea(alge1)
        alegas.aggiungi_linea(alge2)
        puts(alegas)
        puts("---")

        alegas.aggiungi_linea(new Linea("Tortona", "Alessandria", 16))
        puts(alegas.citta_servite())
        puts("-- (l'ordine dell'elenco qui sopra puo' variare) --")

        puts("------ test totale_trasportato e trasporta -----")
        puts(alegas.totale_trasportato("Alessandria","Asti"))
        puts(alegas.totale_trasportato("Bololgna","Asti"))
        puts(alegas.totale_trasportato("Genova","Asti"))
        puts(alegas.totale_trasportato("Alessandria","Genova"))
        puts(alegas.totale_trasportato("Asti","Alessandria"))
        puts("---")
        puts(alegas.trasporta("Asti","Torino",20))
        puts(alegas.trasporta("Asti","Alessandria",20))
        puts(alegas.trasporta("Asti","Alessandria",100))
        puts(alegas.totale_trasportato("Asti","Alessandria"))
        puts(alegas.trasporta("Alessandria","Asti",10))
        puts(alegas.totale_trasportato("Alessandria","Asti"))
        puts(alegas)

        puts("------ test elenca coppie -----")
        puts(alegas.elenca_coppie_citta())
        puts("---")
        puts(alegas.trasporta("Tortona","Alessandria",11))
        puts(alegas.trasporta("Asti","Alessandria",9))
        puts(alegas.elenca_coppie_citta())
        puts("===== Fine test ======")


/*

    ===== Inizio test ======
    ---- test linee ----
    6
    Eccezione OK
    15
    Eccezione OK
    Alessandria --> Asti 24 (30)
    Alessandria --> Asti 25 (40)
    Asti --> Alessandria 0 (25)
    Asti --> Alessandria 0 (50)
    50
    38
    Alessandria --> Genova 22 (60)
    ---- test creazione rete ----
    Alessandria --> Asti 24 (30)
    Alessandria --> Asti 25 (40)
    49
    ---
    Alessandria --> Asti 24 (30)
    Alessandria --> Asti 25 (40)
    Asti --> Alessandria 0 (25)
    Asti --> Alessandria 0 (50)
    Alessandria --> Genova 0 (90)
    Alessandria --> Genova 22 (60)
    71
    ---
    Alessandria
    Genova
    Tortona
    Asti
    4
    -- (l'ordine dell'elenco qui sopra puo' variare) --
    ------ test totale_trasportato e trasporta -----
    49
    0
    0
    22
    0
    ---
    false
    true
    false
    20
    true
    59
    Alessandria --> Asti 24 (30)
    Alessandria --> Asti 35 (40)
    Asti --> Alessandria 20 (25)
    Asti --> Alessandria 0 (50)
    Alessandria --> Genova 0 (90)
    Alessandria --> Genova 22 (60)
    Tortona --> Alessandria 0 (16)
    101
    ------ test elenca coppie -----
    Alessandria --> Asti  59
    Alessandria --> Genova  22
    Asti --> Alessandria  20
    Alessandria --> Tortona  0
    Genova --> Alessandria  0
    Genova --> Tortona  0
    Genova --> Asti  0
    Tortona --> Alessandria  0
    Tortona --> Genova  0
    Tortona --> Asti  0
    Asti --> Genova  0
    Asti --> Tortona  0

    ---
    true
    true
    Alessandria --> Asti  59
    Asti --> Alessandria  29
    Alessandria --> Genova  22
    Tortona --> Alessandria  11
    Alessandria --> Tortona  0
    Genova --> Alessandria  0
    Genova --> Tortona  0
    Genova --> Asti  0
    Tortona --> Genova  0
    Tortona --> Asti  0
    Asti --> Genova  0
    Asti --> Tortona  0

    ===== Fine test ======


*/
